controllerClasses[device_class] = cls
-from xen.xend.server import blkif, netif, tpmif, pciif, iopif, usbif
+from xen.xend.server import blkif, netif, tpmif, pciif, iopif, irqif, usbif
addControllerClass('vbd', blkif.BlkifController)
addControllerClass('vif', netif.NetifController)
addControllerClass('vtpm', tpmif.TPMifController)
addControllerClass('pci', pciif.PciController)
addControllerClass('ioports', iopif.IOPortsController)
+addControllerClass('irq', irqif.IRQController)
addControllerClass('usb', usbif.UsbifController)
'ioports: Failed to configure legacy i/o range: %s - %s' %
(io_from, io_to))
- return (dev, {}, {})
+ return (None, {}, {})
--- /dev/null
+#============================================================================
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#============================================================================
+# Copyright (C) 2004, 2005 Mike Wray <mike.wray@hp.com>
+# Copyright (C) 2005 XenSource Ltd
+# Copyright (C) 2005 Jody Belka
+#============================================================================
+# This code based on tools/python/xen/xend/server/iopif.py and modified
+# to handle interrupts
+#============================================================================
+
+
+import types
+
+import xen.lowlevel.xc;
+
+from xen.xend import sxp
+from xen.xend.XendError import VmError
+
+from xen.xend.server.DevController import DevController
+
+
+xc = xen.lowlevel.xc.xc()
+
+
+class IRQController(DevController):
+
+ def __init__(self, vm):
+ DevController.__init__(self, vm)
+
+
+ def getDeviceDetails(self, config):
+ """@see DevController.getDeviceDetails"""
+
+ def get_param(field):
+ try:
+ val = sxp.child_value(config, field)
+
+ if not val:
+ raise VmError('irq: Missing %s config setting' % field)
+
+ if isinstance(val, types.StringType):
+ return int(val,10)
+ radix = 10
+ else:
+ return val
+ except:
+ raise VmError('irq: Invalid config setting %s: %s' %
+ (field, val))
+
+ pirq = get_param('irq')
+
+ rc = xc.domain_irq_permission(dom = self.getDomid(),
+ pirq = pirq,
+ allow_access = True)
+
+ if rc < 0:
+ #todo non-fatal
+ raise VmError(
+ 'irq: Failed to configure irq: %d' % (pirq))
+
+ return (None, {}, {})
gopts.var('pci', val='BUS:DEV.FUNC',
fn=append_value, default=[],
use="""Add a PCI device to a domain, using given params (in hex).
- For example '-pci c0:02.1a'.
+ For example 'pci=c0:02.1a'.
The option may be repeated to add more than one pci device.""")
gopts.var('ioports', val='FROM[-TO]',
fn=append_value, default=[],
use="""Add a legacy I/O range to a domain, using given params (in hex).
- For example '-ioports 02f8-02ff'.
+ For example 'ioports=02f8-02ff'.
The option may be repeated to add more than one i/o range.""")
+gopts.var('irq', val='IRQ',
+ fn=append_value, default=[],
+ use="""Add an IRQ (interrupt line) to a domain.
+ For example 'irq=7'.
+ This option may be repeated to add more than one IRQ.""")
+
gopts.var('usb', val='PATH',
fn=append_value, default=[],
use="""Add a physical USB port to a domain, as specified by the path
config_ioports = ['ioports', ['from', io_from], ['to', io_to]]
config_devs.append(['device', config_ioports])
+def configure_irq(config_devs, vals):
+ """Create the config for irqs.
+ """
+ for irq in vals.irq:
+ config_irq = ['irq', ['irq', irq]]
+ config_devs.append(['device', config_irq])
+
def configure_usb(config_devs, vals):
for path in vals.usb:
config_usb = ['usb', ['path', path]]
configure_disks(config_devs, vals)
configure_pci(config_devs, vals)
configure_ioports(config_devs, vals)
+ configure_irq(config_devs, vals)
configure_vifs(config_devs, vals)
configure_usb(config_devs, vals)
configure_vtpm(config_devs, vals)